iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

富士大顆系列 第 26

vol. 26 進階的 SQL : JOINs, 聚合, 還有分組!

  • 分享至 

  • xImage
  •  

你好,我是富士大顆 Aiko
今天來補充一點進階的 SQL
本篇會談到:

  • JOINs
  • 聚合函式
  • 分組

聯接(JOINs)

在 SQL 中,透過表與表之間的相關列, JOIN 將來自兩個或多個表的行結合在一起。

  1. INNER JOIN: 交集,只回傳兩個表都符合的一個記錄。

    -- 在 A 表中找到的 id 並且在 B 表中有的 id 情況下,回傳 A 表的 id 與 B 表的 name
    SELECT A.id, B.name FROM tableA A INNER JOIN tableB B ON A.id = B.id;
    
  2. LEFT OUTER JOIN/ LEFT JOIN: 回傳左表的所有紀錄,即使右表中沒有符合。

    --  回傳 A 表的 id 與 B 表的 name,即使 B 表中沒有符合的 id,會回傳左表(A 表)的所有紀錄
    SELECT A.id, B.name FROM tableA A LEFT OUTER JOIN tableB B ON A.id = B.id;
    
  3. RIGHT OUTER JOIN/ RIGHT JOIN: 回傳右表的所有紀錄,即使左表中沒有符合。

    --  回傳 A 表的 id 與 B 表的 name,即使 A 表中沒有符合的 id,會回傳右表(B 表)的所有紀錄
    SELECT A.id, B.name FROM tableA A RIGHT OUTER JOIN tableB B ON A.id = B.id;
    
  4. FULL OUTER JOIN: 聯集,回傳所有左表和右表中的紀錄。

    -- 回傳 A 表和 B 表中所有的 id 和 name 組合
    SELECT A.id, B.name FROM tableA A FULL OUTER JOIN tableB B ON A.id = B.id;
    
  5. CROSS JOIN:產生笛卡兒積,將左表的每一行與右表的每一行組合。

-- 回傳 A 表和 B 表的所有可能組合
SELECT A.id, B.name FROM tableA A CROSS JOIN tableB B;
  1. SELF JOIN: 一個表與自己做 JOIN,通常用於比較表內的紀錄。
-- 找出有相同部門的員工
SELECT A.name, B.name, A.department FROM employees A, employees B WHERE A.department = B.department AND A.id != B.id;

聚合函式(Aggregate Functions)

聚合函式用於對一組值執行計算,並回傳單個數值。

  1. COUNT(): 計算列中的值的總數量。

    -- tableA中有幾個id
    SELECT COUNT(id) FROM tableA;
    
  2. SUM(): 計算列中的值的總和。

    SELECT SUM(salary) FROM tableA;
    
  3. AVG(): 計算列中的平均值。

    SELECT AVG(salary) FROM tableA;
    
  4. MIN() 和 MAX(): 回傳列中的最小和最大值。

    SELECT MIN(salary), MAX(salary) FROM tableA;
    

分組(GROUP BY)

  1. GROUP BY 將一組紀錄分組。
-- 找出每個部門的平均工資
SELECT department, AVG(salary) FROM employees GROUP BY department;
  1. 經常搭配使用 HAVING 子句來過濾 GROUP BY 子句後的結果。
--  找出每個部門的平均工資,但要大於五萬
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 50000;

以上!
不知道明天要寫什麼...


上一篇
vol. 25 資料庫的 SQL 看這篇(應該)就懂了
下一篇
vol. 27 最後的一步:網站部署大辭典
系列文
富士大顆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言